//
// Created by mio on 25-4-10.
//

#include "Channel.h"

void Channel::HandleEvent(int revents)
{
    // 优先处理可能导致连接关闭的事件

    // 如果发生了挂断(HUP)或对端关闭写(RDHUP)
    // 注意：EPOLLHUP 默认总是被epoll监听的，不需要在epoll_ctl中指定
    // EPOLLRDHUP 需要在 epoll_ctl 中明确指定监听 (我们已在 EpollTaskScheduler::Update 中完成)
    if (revents & (EVENT_HUP | EVENT_RDHUP)) {
        if (close_callback_) {
            close_callback_();
            // 通常在 close_callback_ 中会设置关闭标志 (如 TcpConnection::is_closed_)
            // 后续的 read/write callback 应该检查这个标志。
            // 如果希望 HUP/RDHUP 后不再处理 IN/OUT，可以在这里 return，
            // 但让后续回调检查 is_closed_ 更灵活。
        }
    }

    // 如果发生错误
    // 注意：EPOLLERR 默认总是被epoll监听的
    if (revents & EVENT_ERR) {
        if (error_callback_) {
            error_callback_();
            // 错误通常也意味着连接不可用，error_callback_ 内部应处理关闭逻辑
        }
    }

    // 如果可读 (数据到达 或 FIN到达导致read返回0)
    // 将普通可读事件和优先数据事件组合在一起检查。PRI 通常也需要读取
    if (revents & (EVENT_IN | EVENT_PRI)) {
        if (read_callback_) {
            read_callback_();
        }
    }

    // 如果可写
    if (revents & EVENT_OUT) {
        if (write_callback_) {
            write_callback_();
        }
    }
}
